'''
Created on Feb 20, 2011

@author: kivson
'''
import md5
import os.path
from vo.arquivo import Arquivo
from multiprocessing import Process, Queue


class Md5Caulator(Process):
    '''
    classdocs
    '''


    def __init__(self, entrada, saida, flag, bloco = 1024000):
        '''
        Constructor
        '''
        
        self.bloco = bloco
        self.flag = flag
        self.entrada = entrada
        self.saida = saida
        
        Process.__init__(self)
        self.daemon = True

    
    def run(self):
        for arquivo in iter(self.entrada.get, self.flag):
            self.calcula(arquivo)
            self.saida.put(arquivo)
            
    def calcula(self, arquivo):
        
        
        md5alg = md5.new()
        arquivoDisco = file(arquivo.nomeCompleto(),'rb')
#        arquivoDisco.seek(0,2)
#        print arquivoDisco.tell()
#        arquivoDisco.seek(0,0)
        while True:
            buffer = arquivoDisco.read(self.bloco)
            if not buffer:
                break
            md5alg.update(buffer)

        arquivoDisco.close()
        arquivo.md5 = md5alg.hexdigest()
    
     
class Md5Manager(object):
    
    FLAGTOSTOP = 'STOP'
    
    def __init__(self, listaDeArquivos, n = 1):
        
        self.qtdProcessos = n
        self.entrada = Queue()
        self.listaDeArquivos = listaDeArquivos
        
        self.saida = Queue()
        for i in xrange(n):
            processo = Md5Caulator(self.entrada, self.saida, self.FLAGTOSTOP)
            processo.start()
    
    def processa(self):
        
        for item in self.listaDeArquivos:
            self.entrada.put(item)
        
        '''Envia os sinais de termino aos processos'''
        for  i in xrange(self.qtdProcessos):    
            self.entrada.put(self.FLAGTOSTOP)
        
        return self.saida


if __name__ == '__main__':
    arqs = []
    for i in xrange(10):
        arqs.append(Arquivo("teste", "noMd5", "./"))
    
    
    hasher = Md5Manager(arqs)
    
    
    
    for i in xrange(10):
        print arqs[i].md5
        
        
    listaProcessada = hasher.processa()
    
    for i in iter(listaProcessada.get, 'SDF'):
        print i.md5
        listaProcessada.join()
    
    
    
    for i in xrange(10):
        print arqs[i].md5
        